package com.reggie.serve.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.reggie.serve.dto.DishDto;
import com.reggie.serve.entity.Dish;
import com.reggie.serve.entity.DishFlavor;
import com.reggie.serve.mapper.DishMapper;
import com.reggie.serve.service.DishFlavorService;
import com.reggie.serve.service.DishService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    private final DishFlavorService dishFlavorService;

    /**
     * 保存菜品及其口味信息。
     * 使用事务确保操作的原子性，即要么全部保存成功，要么全部失败。
     * 此方法首先保存菜品的基本信息，然后根据菜品的口味列表，为每个口味设置菜品ID，并批量保存这些口味信息。
     *
     * @param dishDto 菜品数据传输对象，包含菜品的基本信息和口味列表。
     */
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        // 保存菜品基本信息
        this.save(dishDto);
        // 获取刚刚保存的菜品的ID
        Long dishId = dishDto.getId();
        // 对菜品口味列表进行处理，设置每个口味的菜品ID，并收集为列表
        List<DishFlavor> flavors = dishDto.getFlavors().stream().peek((item) -> item.setDishId(dishId)).collect(Collectors.toList());
        // 批量保存处理后的菜品口味信息
        //保存菜品口味数据到菜品口味表dish_flavor
        dishFlavorService.saveBatch(flavors);
    }

    @Override
    public DishDto getByIdWithFlavor(Long id) {
        Dish dish = this.getById(id);
        if (dish != null) {
            DishDto dishDto = new DishDto();
            // 对象拷贝
            BeanUtils.copyProperties(dish, dishDto);
            // 查询当前菜品对应的口味信息，并封装到dishDto中
            LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(DishFlavor::getDishId, dish.getId());
            List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);
            dishDto.setFlavors(flavors);
            return dishDto;
        } else {
            throw new RuntimeException("菜品信息不存在");
        }
    }

    @Override
    @Transactional
    public void updateWithFlavor(DishDto dishDto) {
        //更新dish表基本信息
        this.updateById(dishDto);
        //清理当前菜品对应口味数据---dish_flavor表的delete操作
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
        dishFlavorService.remove(queryWrapper);
        //添加当前提交过来的口味数据---dish_flavor表的insert操作
        List<DishFlavor> flavors = dishDto.getFlavors().stream().peek((item) -> item.setDishId(dishDto.getId())).collect(Collectors.toList());
        dishFlavorService.saveBatch(flavors);
    }
}
